/* eslint-disable
    camelcase,
    handle-callback-err,
    max-len,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * DS103: Rewrite code to no longer use __guard__
 * DS207: Consider shorter variations of null checks
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
const ProjectGetter = require('../Project/ProjectGetter')
const OError = require('@overleaf/o-error')
const ProjectLocator = require('../Project/ProjectLocator')
const ProjectEntityHandler = require('../Project/ProjectEntityHandler')
const ProjectEntityUpdateHandler = require('../Project/ProjectEntityUpdateHandler')
const logger = require('logger-sharelatex')
const _ = require('lodash')

module.exports = {
  getDocument(req, res, next) {
    if (next == null) {
      next = function(error) {}
    }
    const project_id = req.params.Project_id
    const { doc_id } = req.params
    const plain =
      __guard__(req != null ? req.query : undefined, x => x.plain) === 'true'
    return ProjectGetter.getProject(
      project_id,
      { rootFolder: true, overleaf: true },
      function(error, project) {
        if (error != null) {
          return next(error)
        }
        if (project == null) {
          return res.sendStatus(404)
        }
        return ProjectLocator.findElement(
          { project, element_id: doc_id, type: 'doc' },
          function(error, doc, path) {
            if (error != null) {
              OError.tag(error, 'error finding element for getDocument', {
                doc_id,
                project_id
              })
              return next(error)
            }
            return ProjectEntityHandler.getDoc(project_id, doc_id, function(
              error,
              lines,
              rev,
              version,
              ranges
            ) {
              if (error != null) {
                OError.tag(
                  error,
                  'error finding doc contents for getDocument',
                  {
                    doc_id,
                    project_id
                  }
                )
                return next(error)
              }
              if (plain) {
                res.type('text/plain')
                return res.send(lines.join('\n'))
              } else {
                const projectHistoryId = _.get(project, 'overleaf.history.id')
                const projectHistoryType = _.get(
                  project,
                  'overleaf.history.display'
                )
                  ? 'project-history'
                  : undefined // for backwards compatibility, don't send anything if the project is still on track-changes
                return res.json({
                  lines,
                  version,
                  ranges,
                  pathname: path.fileSystem,
                  projectHistoryId,
                  projectHistoryType
                })
              }
            })
          }
        )
      }
    )
  },

  setDocument(req, res, next) {
    if (next == null) {
      next = function(error) {}
    }
    const project_id = req.params.Project_id
    const { doc_id } = req.params
    const { lines, version, ranges, lastUpdatedAt, lastUpdatedBy } = req.body
    return ProjectEntityUpdateHandler.updateDocLines(
      project_id,
      doc_id,
      lines,
      version,
      ranges,
      lastUpdatedAt,
      lastUpdatedBy,
      function(error) {
        if (error != null) {
          OError.tag(error, 'error finding element for getDocument', {
            doc_id,
            project_id
          })
          return next(error)
        }
        logger.log(
          { doc_id, project_id },
          'finished receiving set document request from api (docupdater)'
        )
        return res.sendStatus(200)
      }
    )
  }
}

function __guard__(value, transform) {
  return typeof value !== 'undefined' && value !== null
    ? transform(value)
    : undefined
}
